package com.king.juc.locksupport;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.locks.LockSupport;

/**
 * LockSupport.park()/unpark() 基本使用
 *
 * 特点
 *      与 Object 的 wait & notify 相比
 *          wait, notify 和 notifyAll 必须配合 Object Monitor 一起使用, 而 park/unpark 不必
 *          park & unpark 是以线程为单位来 [阻塞] 和 [唤醒] 线程, 而 notify 只能随机唤醒一个等待线程,
 *          nofityAll 是唤醒所有等待线程, 就不那么 [精确]
 *          park & unpark 可以先 unpark, 而 wait & notify 不能先 notify
 * @author king
 * @date 2020/11/20 14:05
 */
@Slf4j(topic = "c.ParkUnparkDemo")
public class ParkUnparkDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            log.debug("start...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("park...");
            LockSupport.park();
            log.debug("resume...");
        }, "t1");
        t1.start();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        log.debug("unpark...");
        // 恢复线程运行
        LockSupport.unpark(t1);
    }
}
